package edu.qd.learn.day04;

import javax.swing.colorchooser.AbstractColorChooserPanel;
import java.util.Arrays;

/**
 * 线性表是最基本、最简单、也是最常用的一种数据结构。
 * 线性表（linear list）是数据结构的一种，一个线性表是n个具有相同特性的数据元素的有限序列。
 * <p>
 * ‌数组是一种线性表数据结构‌。数组（Array）是一种线性表数据结构，它使用一组连续的内存空间来存储一组具有相同类型的数据‌12。
 * 线性表（Linear List）是指数据排成像一条线一样的结构，每个线性表上的数据最多只有前和后两个方向。
 * 除了数组，链表、队列、栈等也是线性表结构‌
 * <p>
 * //        类型【】 名称 = new 类型【长度】;
 * //        int[] a = new int[13];  // 20kb
 * //        名称[下标|索引] = [实例，引用];
 * Dog[] ds = new Dog[4];
 * ds[0] = new Dog();
 * Dog d1 = new Dog();
 * ds[1] = d1;
 * <p>
 * int[] arr01 = new int[6];
 * arr01[0] = 1;
 * int[][] arr02 = new int[2][];
 * arr02[0][1] = 23;
 *
 * @author 布衣
 */
public class LinerList<X> {
    //研发工程师  开发工程师 测开工程师 【实施  技术支持】
    // javaweb全栈  java后端软件开发工程师
    //1  数组 设计出来一个线性表结构
    // 1。1 添加方法(当前数组满了以后，和茺要发生变化) 2.31-1-8
    //1.2 删除方法
    //1.3 长度方法
    //1。4 插入方法
    private X[] arr01;
    private int size = 0;

    //Array :数组  java计算机语言 （是否有人帮你写了数组复制的方法）  Arrays 数组帮助类
    public boolean add(X x1) {
        if (arr01 == null) {
            arr01 = (X[]) new Object[10];
        }
        extendSize();
        arr01[size++] = x1;
        return true;
    }

    public boolean delete(int fromIndex, int toIndex) {
        //临界问题
        if (fromIndex < 0 || toIndex > size-1) {
            throw new RuntimeException("请正确传递参数!!!");
        }
        if (toIndex < fromIndex) {
            throw new RuntimeException("fromindex 要小于toindex");
        }
        for (int i = toIndex; i < size; i++) {
            arr01[i - (toIndex - fromIndex)] = arr01[i];
        }
        size = size - (toIndex - fromIndex);
        return true;
    }

    //方法重载
    public boolean delete(int index) {
        if(index == size-1){
            size--;
            return true;
        }
        return delete(index, index + 1);
    }

    public X get(int index) {
        //临界问题
        if (index < 0 || index >= size) {
            throw new RuntimeException("请正确传递参数!!!");
        }
        return arr01[index];
    }

    /**
     * 返回线性表的元素个数
     * @return
     */
    public int size() {
        return size;
    }

    private void extendSize(){
        if (arr01.length == size) {
            int newLen = arr01.length << 1 > Integer.MAX_VALUE ? Integer.MAX_VALUE : arr01.length << 1;
            arr01 = Arrays.copyOf(arr01, newLen);
        }
    }

    public boolean insert(int index,X val){
        if (arr01 == null) {
            throw new RuntimeException("请先添加一些元素");
        }

        if(index == size){
            return add(val);
        }

        extendSize();
        for(int i = size - 1;i >=index;i--){
            arr01[i+1]=arr01[i];
        }
        arr01[index] = val;
        size++;
        return true;
    }

    public static void main(String[] args) {
        LinerList<Integer> abc = new LinerList<>();
        abc.add(1);
        abc.add(2);
        abc.add(3);
        abc.add(4);
        abc.add(5);
        abc.add(6);
        abc.add(7);
        abc.add(8);
        System.out.println("原有元素个数为" + abc.size());
//        abc.delete(7);
        abc.insert(8,100);

        System.out.println(abc.size() + "。。。");
        for (int i = 0; i < abc.size(); i++) {
            System.out.println(abc.get(i));
        }
    }

}

